#include "ProtocoloPlano.h"
#include "utils/UtilString.h"
#include "DTOEvent.h"
#include "DTOAsteroide.h"
#include "DTOCliente.h"
#include "DTOFinHandshake.h"
#include "DTOShipStatus.h"
#include "DTOShipAction.h"
#include "DTOImage.h"
#include "DTOExplosion.h"
#include "DTOBonus.h"

ProtocoloPlano::ProtocoloPlano()
{
}

DTO* ProtocoloPlano::deserializar(std::string& serializacion){
	DTO* dtoRetorno= NULL;

	DTOTypes tipoDTO = getTipoDTO(serializacion);

	std::string ownerDTO = getOwnerDTO(serializacion);

	switch (tipoDTO) {
		case EVENT:
				dtoRetorno = new DTOEvent(serializacion,ownerDTO);
			break;
		case ASTEROIDE_STATUS:
				dtoRetorno = new DTOAsteroide(serializacion,ownerDTO);
			break;
		case CLIENTE:
				dtoRetorno = new DTOCliente(serializacion,ownerDTO);
			break;
		case FIN_HANDSHAKE:
				dtoRetorno = new DTOFinHandshake(serializacion,ownerDTO);
			break;
		case SHIP_STATUS:
				dtoRetorno = new DTOShipStatus(serializacion,ownerDTO);
			break;
		case NEW_EXPLOSION:
				dtoRetorno = new DTOExplosion(serializacion,ownerDTO);
			break;
		case NEW_BONUS:
				dtoRetorno = new DTOBonus(serializacion,ownerDTO);
			break;
		case SHIP_ACTION:
				dtoRetorno = new DTOShipAction(serializacion,ownerDTO);
			break;
		case IMAGE:
				dtoRetorno = new DTOImage(serializacion,ownerDTO);
			break;
	}

	return dtoRetorno;
}

DTOTypes ProtocoloPlano::getTipoDTO(std::string& serializacion){
	return (DTOTypes)UtilString::stringToInt(UtilString::FROMlenghtStringStringValue(serializacion));
}

std::string ProtocoloPlano::getOwnerDTO(std::string& serializacion){
	return UtilString::FROMlenghtStringStringValue(serializacion);
}

std::string ProtocoloPlano::serializar(DTO* dto){

	std::string serializacion;

	std::string tipoDTO = UtilString::intToString(dto->getType());
	std::string owner =dto->getOwner();


	serializacion += UtilString::TOlenghtStringStringValue(tipoDTO);
	serializacion += UtilString::TOlenghtStringStringValue(owner);
	serializacion += dto->serializar();

	return serializacion;
}



